
import caurina.transitions.*;
import flash.filters.DropShadowFilter;
import flash.utils.flash_proxy;
import mx.containers.Canvas;
import mx.containers.VBox;
import mx.controls.Alert;
import mx.controls.Image;
import mx.controls.Text;
import mx.core.Application;
import mx.managers.PopUpManager;
import mx.messaging.management.Attribute;
import org.papervision3d.cameras.*;
import org.papervision3d.core.*;
import org.papervision3d.events.*;
import org.papervision3d.lights.*;
import org.papervision3d.lights.PointLight3D;
import org.papervision3d.materials.*;
import org.papervision3d.materials.shadematerials.*;
import org.papervision3d.materials.utils.MaterialsList;
import org.papervision3d.objects.*;
import org.papervision3d.objects.primitives.*;
import org.papervision3d.render.*;
import org.papervision3d.scenes.*;
import org.papervision3d.view.*;
import spark.components.Image;
import spark.components.Label;

// Déclaration des variables
private var numOfItems:int = 10;
private var radius:Number = 600;
private var anglePer:Number = (Math.PI*2) / numOfItems;
public var angleX:Number = anglePer;
public var dest:Number = 1;
private var theLight:PointLight3D;
private var viewport:Viewport3D;  
private var scene:Scene3D;  
private var camera:Camera3D; 
private var renderer:BasicRenderEngine; 
private var planeArray:Array = new Array();
[Bindable]
public var object:Object;
private var arrayPlane:Object;
private var p:Plane;
private static var t:XMLList;
		
// Initialisation du caroussel
public function init():void {
			
	viewport = new Viewport3D(pv3dCanvas.width, pv3dCanvas.height, false, true);  
	pv3dCanvas.rawChildren.addChild(viewport);  
	viewport.buttonMode=true;	
	renderer = new BasicRenderEngine(); 
	scene = new Scene3D();  
	camera = new Camera3D();
	camera.zoom = 2;  
	createObjects();  
	addEventListeners();
	
}

//Création des images à partir du XML          
private function createObjects():void{
	
	//recuperation du nombre de livre afin d'afficher les images
	var size:uint = data.child("livre").length();
				
	for(var i:uint=0; i<size; i++){
		
		//récuperation de la balise couverture afin d'obtenir les chemins de chaque image
		var couv:String = data.livre[i].couverture;
		var bam:BitmapFileMaterial = new BitmapFileMaterial("images/"+couv+".jpg");
		var shadow:DropShadowFilter = new DropShadowFilter();
		shadow.distance = 10;
		shadow.angle = 25; 

		bam.oneSide = false;
		bam.smooth = true;
		bam.interactive = true;
		
		//modifier taille images
		p = new Plane(bam, 300, 400, 2, 2);
		p.x = Math.cos(i*anglePer) * radius;
		p.z = Math.sin(i*anglePer) * radius;
		p.rotationY = (-i*anglePer) * (180/Math.PI) + 270;
		
		scene.addChild(p);
		p.extra={pIdent:"in"};
		p.name=""+i;
		p.addEventListener(InteractiveScene3DEvent.OBJECT_PRESS, toggler);						 
		planeArray[i] = p;
	}
		
	// Création d'un effet de lumière 
	theLight = new PointLight3D();
	scene.addChild(theLight);
	theLight.y = pv3dCanvas.height;	
}   
		
private function ajout(event:InteractiveScene3DEvent):void{
	
	//recuperation du nombre de livre 
	var size:uint = data.child("livre").length();
	var i:uint= event.target.name;
	
	//recuperation de l'identifiant du livre
	var id:uint = data.livre[i].@['id'];
	
	//recuperation du titre
	var titre:String = data.livre[i].titre;
	
	//recuperation du ou des auteurs
	var auteur:String=data.livre[i].auteur[0]+"; ";
	var sizeauteur:uint= data.livre[i].auteur.length();	
	if(sizeauteur>1){
		for (var j:uint=1; j<sizeauteur;j++){
			auteur+=data.livre[i].auteur[j]+"; ";
		}
	}
	
	//recuperation de l'editeur
	var editeur:String = data.livre[i].editeur;
	
	//recuperation de l'annee
	var annee:String = data.livre[i].annee;
	
	//recuperation du resume
	var resume:String = data.livre[i].resume;
	
	//recuperation du ou des extraits
	var sizeextrait:uint= data.livre[i].extrait.length();
	
	//recuperation du nb pages
	var nbpages:String = data.livre[i].nbpages;
	
	//recuperation de la couverture
	var couverture:String = data.livre[i].couverture;
	
	// Affichage des informations sur les livres
	// et du bouton de réinitialisation
	tabNav.visible=true;
	retour.visible=true;

	// Création du conteneur des informations
	var vbox:VBox = new VBox();
	vbox.percentHeight = vbox.percentWidth = 100;
	vbox.label = "Informations du livre "+titre;
	
	// Ajout des informations
	var texte:Text=new Text();
	texte.htmlText="<b><u>Titre :</u></b> " + titre + String.fromCharCode(13)+
		"<b><u>Auteur(s) :</u></b> " + auteur +String.fromCharCode(13)+
		"<b><u>Editeur : </u></b> " + editeur + String.fromCharCode(13)+							
		"<b><u>Année : </u></b> " + annee+ String.fromCharCode(13)+
		"<b><u>Résumé : </u></b> " + resume+ String.fromCharCode(13)+
		"<b><u>Nombre de pages :</u></b> " +nbpages+String.fromCharCode(13);
	
	// Ajout du conteneur comme fils du TabNavigator
	vbox.addChild(texte);
	tabNav.addChild(vbox);

	// Ajout d'un conteneur pour chaque extrait
	for (var k:uint=0; k<sizeextrait;k++){
		
		var extrait:String="";
		var vbox2:VBox = new VBox();
		vbox2.percentHeight = 100;
		vbox2.label = "Extrait"+(k+1);
		
		// Création du texte à partir de l'extrait récupéré
		var texte2:Text=new Text();
		extrait += data.livre[i].extrait[k];
		texte2.htmlText="<b><u>Extrait :</u></b> "+ extrait;
		
		// Ajout de chaque extrait au TabNavigator
		vbox2.addChild(texte2);
		tabNav.addChild(vbox2);
	}
}

// Gestion du clic d'une image
private function toggler(event:InteractiveScene3DEvent):void{
			
	// Si l'image est avancé, on la recule, sinon on l'avance
	if (event.target.extra.pIdent == "in"){      	    
		moveOut(event.target);
	}
	else{   
		moveBack(event.target);
	}
	// On appel la function qui ajoute les informations de l'image cliquée 
	ajout(event);
}

// Fonction permettant une mise en avant de l'image cliquée
private function moveOut(object:Object):void{
	
	for each (var arrayPlane:Object in planeArray){		
		if (arrayPlane != object){
			arrayPlane.removeEventListener(InteractiveScene3DEvent.OBJECT_PRESS, toggler);
		}
	}
					 
	Tweener.addTween(object, {scaleX:1.2, time:0.5, transition:"easeInOutSine", onComplete:rotateCube, onCompleteParams:[object]});
	Tweener.addTween(object, {scaleY:1.2, time:0.5, transition:"easeInOutSine", onComplete:rotateCube, onCompleteParams:[object]});
	object.extra = {pIdent:"out"};
}

// Function permettant la retractation de l'image
private function moveBack(object:Object):void{

	for each (var arrayPlane:Object in planeArray){
		if (arrayPlane != object){
			arrayPlane.addEventListener(InteractiveScene3DEvent.OBJECT_PRESS, toggler);
		}
	}
		
	Tweener.addTween(object, {scaleX:1, time:0.5, transition:"easeInOutSine", onComplete:rotateCube, onCompleteParams:[object]});
	Tweener.addTween(object, {scaleY:1, time:0.5, transition:"easeInOutSine", onComplete:rotateCube, onCompleteParams:[object]});
	object.extra = {pIdent:"in"};
}
					
private function goBack():void{

	for each (var arrayPlane:Object in planeArray){
		if (arrayPlane != object){
			arrayPlane.addEventListener(InteractiveScene3DEvent.OBJECT_PRESS, toggler);
		}
	}
}
	
private function rotateCube(object:Object):void{
		//object.rotationX = 0;
		//Tweener.addTween(object, {rotationZ:0, time:0.5, transition:"easeOutSine"});
}
	
private function addEventListeners():void{
	this.addEventListener(Event.ENTER_FRAME, render);
}        
		   
private function render(e:Event):void{  
							 
	renderer.renderScene(scene, camera, viewport);
	camera.x = Math.cos(angleX) * 800;					 
	camera.z = Math.sin(angleX) * 800;       
}
			 
private function moveRight():void{   
	dest++;
	Tweener.addTween(this, {angleX:dest*anglePer, time:0.5});
}
	
private function moveLeft():void{
	dest--;
	Tweener.addTween(this, {angleX:dest*anglePer, time:0.5});
}   

private function fermerTabNav():void{
	
	// Suppression de tous les élément du TabNavigator
	tabNav.removeAllChildren();
	// On cache le TabNavigator et le bouton de suppression
	retour.visible=false;
	tabNav.visible=false;
}
